<?xml version="1.0"?>
<atom:feed xmlns:atom="http://www.w3.org/2005/Atom" xmlns:html="http://www.w3.org/1999/xhtml">
  <atom:id>http://bill.welliver.org/atom/pike/Objective C Bridge</atom:id>
  <atom:title type="text">electronic.alchemy :: Objective C Bridge</atom:title>
  <atom:updated>2026-04-05T15:33:17-04:00</atom:updated>
  <atom:link href="http://bill.welliver.org/atom/pike/Objective C Bridge" type="application/atom+xml"></atom:link>
  <atom:link href="http://bill.welliver.org/space/pike/Objective C Bridge" type="text/html"></atom:link>
  <atom:link href="http://bill.welliver.org/rss/pike/Objective C Bridge" type="application/rss+xml"></atom:link>
  <atom:generator uri="http://modules.gotpike.org/blahblah/Public.Syndication.ATOM" version="0.1">Public.Syndication.ATOM (Pike v8.0 release 702)</atom:generator>
  <atom:icon>http://bill.welliver.org/favicon.ico</atom:icon>
  <atom:logo>http://bill.welliver.org/static/images/alchemy.gif</atom:logo>
  <atom:subtitle type="xhtml"><html:div xmlns:html="http://www.w3.org/1999/xhtml"><html:p>Public.ObjectiveC is a Pike module that can be used to integrate ObjectiveC objects and Pike. ObjectiveC is most commonly associated with the <html:a href="Cocoa" class="wiki_link_external">http://developer.apple.com</html:a> development environment used in MacOS X.</html:p><html:p class="paragraph"/>
<html:b class="bold">Why?</html:b><html:p class="paragraph"/>
Originally, I wanted to be able to integrate with the Growl system to allow me to send messages and notifications from my Pike apps. Later, I decided that it might be cool to be able to write native Cocoa apps in Pike. This is the (in-progress) result of this.<html:p class="paragraph"/>
Some of the features currently available in this module:&#xD;
<html:ul class="minus">
<html:li>creating instances of Cocoa classes from Pike</html:li>
<html:li>creating instances of Pike classes from Cocoa</html:li>
<html:li>sending messages (call functions) to native Cocoa objects.</html:li>
<html:li>Cocoa sending messages (call functions) to your Pike objects.</html:li>
<html:li>the ability to pass Pike objects to Cocoa</html:li>
<html:li>setting variables in Pike objects from Cocoa</html:li>
<html:li>argument conversion: strings, floats, ints and arrays (in addition to objects).</html:li>
<html:li>loading new bundles (frameworks) on the fly.</html:li>
<html:li>c-level mixins for providing hand-coded versions of methods.</html:li>
<html:li>NSDictionary and NSArray classes have Pike style accessors to make them easier to use from within Pike.</html:li>
<html:li>support for NSRunLoop in the Pike backend</html:li>
</html:ul>Additionally, I recently started adding support to Pike 7.7 for a Pike framework. This should allow Pike to be embedded into an Objective C application. Some (minor) additional work needs to be done to generate the proper bundle, but the dynamic library itself is being properly created. I'll include an example of using that below, for completeness.<html:p class="paragraph"/>
<html:b class="bold">Download</html:b><html:p class="paragraph"/>
You can download a copy of the bridge compiled for Tiger/Intel <html:a href="here" class="wiki_link_external">http://hww3.riverweb.com/dist/</html:a>. Simply untar it into your Pike modules directory. Note that this is an old version and many new features have been added.<html:p class="paragraph"/>
<html:b class="bold">Example</html:b><html:p class="paragraph"/>
And now, without any further ado, some examples:<html:p class="paragraph"/>
The following code demonstrates the use of the Message framework to send an email:<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
Pike v7.7 release 30 running Hilfe v3.5 (Incremental Pike Frontend)&#xD;
&gt; <html:b><html:font color="darkblue">import</html:font></html:b> Public.ObjectiveC;                                                                     &#xD;
&gt; load_bundle(<html:i><html:font color="darkred">"Message.framework"</html:font></html:i>);                                                             &#xD;
(1) Result: 0&#xD;
&gt; Cocoa.NSMailDelivery.deliverMessage_subject_to_(<html:i><html:font color="darkred">"whee"</html:font></html:i>, <html:i><html:font color="darkred">"test message"</html:font></html:i>, <html:i><html:font color="darkred">"hww3@riverweb.com"</html:font></html:i>); &#xD;
(2) Result: 1&#xD;
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
The following example is a demonstration of the primary reason I wrote the module. This example sends notifications to the <html:a href="Growl" class="wiki_link_external">http://www.growl.info</html:a> notification system. You'll need to have Growl installed in order for this to work.<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
<html:b><html:font color="darkblue">import</html:font></html:b> Public.ObjectiveC;&#xD;
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">i</html:font></html:b>;&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">pool</html:font></html:b>;<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">void </html:font></html:b><html:b><html:font color="darkbrown">create</html:font></html:b>()&#xD;
{&#xD;
  Public.ObjectiveC.load_bundle(<html:i><html:font color="darkred">"Growl.framework"</html:font></html:i>);&#xD;
  <html:b><html:font color="darkgreen">program </html:font></html:b><html:b><html:font color="darkbrown">g</html:font></html:b> = get_dynamic_class(<html:i><html:font color="darkred">"GrowlApplicationBridge"</html:font></html:i>);&#xD;
  g-&gt;setGrowlDelegate_(this);&#xD;
}<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>()&#xD;
{&#xD;
	call_out(notify, 6);&#xD;
	<html:b><html:font color="darkblue">return</html:font></html:b> -1;&#xD;
}&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">p</html:font></html:b>;<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">mapping </html:font></html:b><html:b><html:font color="darkbrown">registrationDictionaryForGrowl</html:font></html:b>(<html:b><html:font color="darkgreen">mixed </html:font></html:b><html:b><html:font color="darkbrown">...</html:font></html:b> args) {<html:p class="paragraph"/>
	<html:b><html:font color="darkgreen">mapping </html:font></html:b><html:b><html:font color="darkbrown">n</html:font></html:b> = ([]);<html:p class="paragraph"/>
	n-&gt;ApplicationName = <html:i><html:font color="darkred">"PGrowl"</html:font></html:i>;&#xD;
	n-&gt;AllNotifications = ({<html:i><html:font color="darkred">"New Announcement"</html:font></html:i>});&#xD;
	n-&gt;DefaultNotifications = ({<html:i><html:font color="darkred">"New Announcement"</html:font></html:i>});&#xD;
        n-&gt;ApplicationIcon = Cocoa.NSWorkspace.sharedWorkspace()-&gt;iconForFileType_(<html:i><html:font color="darkred">"jpg"</html:font></html:i>)-&gt;TIFFRepresentation();<html:p class="paragraph"/>
	<html:b><html:font color="darkblue">return</html:font></html:b> n;&#xD;
}<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">void </html:font></html:b><html:b><html:font color="darkbrown">notify</html:font></html:b>()&#xD;
{&#xD;
	<html:b><html:font color="darkgreen">mapping </html:font></html:b><html:b><html:font color="darkbrown">n</html:font></html:b> = ([]);<html:p class="paragraph"/>
	n-&gt;ApplicationName = <html:i><html:font color="darkred">"PGrowl"</html:font></html:i>;&#xD;
	n-&gt;NotificationName = <html:i><html:font color="darkred">"New Announcement"</html:font></html:i>;&#xD;
	n-&gt;NotificationPriority = Cocoa.NSNumber.numberWithInt_(2);&#xD;
	n-&gt;NotificationSticky = Cocoa.NSNumber.numberWithBool_(0);&#xD;
	n-&gt;NotificationTitle = <html:i><html:font color="darkred">"notification from PGrowl"</html:font></html:i>;&#xD;
	n-&gt;NotificationDescription = <html:i><html:font color="darkred">"whooo, it's "</html:font></html:i> <html:ins class="inserted"> Calendar.now()-&gt;format_smtp() </html:ins> <html:i><html:font color="darkred">"!&amp;#110;greetings from Public.ObjectiveC!"</html:font></html:i>;&#xD;
	n-&gt;NotificationIcon = Cocoa.NSWorkspace.sharedWorkspace()-&gt;iconForFileType_(<html:i><html:font color="darkred">"jpg"</html:font></html:i>)-&gt;TIFFRepresentation();&#xD;
	n-&gt;NotificationAppIcon = Cocoa.NSWorkspace.sharedWorkspace()-&gt;iconForFileType_(<html:i><html:font color="darkred">"jpg"</html:font></html:i>)-&gt;TIFFRepresentation();<html:p class="paragraph"/>
	get_dynamic_class(<html:i><html:font color="darkred">"GrowlApplicationBridge"</html:font></html:i>)-&gt;notifyWithDictionary_(n);<html:p class="paragraph"/>
    <html:font color="red">// lather, rinse and repeat.&#xD;
</html:font>	call_out(notify, 5);&#xD;
}&#xD;
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
Or, if you prefer, without a lot of automatic type conversions:<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
<html:b><html:font color="darkblue">import</html:font></html:b> Public.ObjectiveC;&#xD;
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">i</html:font></html:b>;<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">void </html:font></html:b><html:b><html:font color="darkbrown">create</html:font></html:b>()&#xD;
{&#xD;
  Public.ObjectiveC.low_load_bundle(<html:i><html:font color="darkred">"/System/Library/Frameworks/Growl.framework"</html:font></html:i>);&#xD;
  NSClass(<html:i><html:font color="darkred">"GrowlApplicationBridge"</html:font></html:i>)-&gt;setGrowlDelegate_(this);&#xD;
}<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>()&#xD;
{&#xD;
	call_out(notify, 6);&#xD;
	<html:b><html:font color="darkblue">return</html:font></html:b> -1;&#xD;
}<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">p</html:font></html:b>;<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">registrationDictionaryForGrowl</html:font></html:b>(<html:b><html:font color="darkgreen">mixed </html:font></html:b><html:b><html:font color="darkbrown">...</html:font></html:b> args) {<html:p class="paragraph"/>
	<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">n</html:font></html:b> = Cocoa.NSMutableDictionary-&gt;dictionaryWithCapacity(2);<html:p class="paragraph"/>
	n-&gt;setObject_forKey_(<html:i><html:font color="darkred">"PGrowl"</html:font></html:i>, <html:i><html:font color="darkred">"ApplicationName"</html:font></html:i>);  &#xD;
	n-&gt;setObject_forKey_(({<html:i><html:font color="darkred">"New Announcement"</html:font></html:i>}), <html:i><html:font color="darkred">"AllNotifications"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(({<html:i><html:font color="darkred">"New Announcement"</html:font></html:i>}), <html:i><html:font color="darkred">"DefaultNotifications"</html:font></html:i>);&#xD;
  n-&gt;setObject_forKey_(NSClass(<html:i><html:font color="darkred">"NSWorkspace"</html:font></html:i>)-&gt;sharedWorkspace()-&gt;iconForFileType_(<html:i><html:font color="darkred">"jpg"</html:font></html:i>)-&gt;TIFFRepresentation(), &#xD;
    <html:i><html:font color="darkred">"ApplicationIcon"</html:font></html:i>);<html:p class="paragraph"/>
	<html:b><html:font color="darkblue">return</html:font></html:b> n;&#xD;
}<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">void </html:font></html:b><html:b><html:font color="darkbrown">notify</html:font></html:b>()&#xD;
{&#xD;
	<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">n</html:font></html:b> = Cocoa.NSMutableDictionary-&gt;dictionaryWithCapacity(6); &#xD;
	n-&gt;setObject_forKey_(<html:i><html:font color="darkred">"PGrowl"</html:font></html:i>, <html:i><html:font color="darkred">"ApplicationName"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(<html:i><html:font color="darkred">"New Announcement"</html:font></html:i>, <html:i><html:font color="darkred">"NotificationName"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(Cocoa.NSNumber-&gt;new()-&gt;initWithInt_(2), <html:i><html:font color="darkred">"NotificationPriority"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(Cocoa.NSNumber-&gt;new()-&gt;initWithBool_(0), <html:i><html:font color="darkred">"NotificationSticky"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(<html:i><html:font color="darkred">"notification from PGrowl"</html:font></html:i>, <html:i><html:font color="darkred">"NotificationTitle"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(<html:i><html:font color="darkred">"whooo, it's "</html:font></html:i> <html:ins class="inserted"> Calendar.now()-&gt;format_smtp() </html:ins> <html:i><html:font color="darkred">"!&amp;#110;greetings from Public.ObjectiveC!"</html:font></html:i>, <html:i><html:font color="darkred">"NotificationDescription"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(NSClass(<html:i><html:font color="darkred">"NSWorkspace"</html:font></html:i>)-&gt;sharedWorkspace()-&gt;iconForFileType_(<html:i><html:font color="darkred">"jpg"</html:font></html:i>)-&gt;TIFFRepresentation(), <html:i><html:font color="darkred">"NotificationIcon"</html:font></html:i>);&#xD;
	n-&gt;setObject_forKey_(NSClass(<html:i><html:font color="darkred">"NSWorkspace"</html:font></html:i>)-&gt;sharedWorkspace()-&gt;iconForFileType_(<html:i><html:font color="darkred">"jpg"</html:font></html:i>)-&gt;TIFFRepresentation(), <html:i><html:font color="darkred">"NotificationAppIcon"</html:font></html:i>);<html:p class="paragraph"/>
	NSClass(<html:i><html:font color="darkred">"GrowlApplicationBridge"</html:font></html:i>)-&gt;notifyWithDictionary_(n);&#xD;
	call_out(notify, 5);&#xD;
}<html:p class="paragraph"/>
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
The following example is a simple AddressBook export application. This demonstrates iterator support in certain datatypes (like NSArrays), casting of NSStrings to Pike strings and some mixins (the AddressBook constants, for example).<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
<html:b><html:font color="darkblue">import</html:font></html:b> Public.ObjectiveC;<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">array </html:font></html:b><html:b><html:font color="darkbrown">fields</html:font></html:b> = ({&#xD;
    Cocoa.ABAddressBook.kABLastNameProperty,&#xD;
    Cocoa.ABAddressBook.kABFirstNameProperty,&#xD;
    Cocoa.ABAddressBook.kABEmailProperty&#xD;
  });<html:p class="paragraph"/>
&#xD;
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>()&#xD;
{&#xD;
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">book</html:font></html:b> = Cocoa.ABAddressBook.sharedAddressBook();&#xD;
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">p</html:font></html:b> = book-&gt;people();<html:p class="paragraph"/>
  <html:b><html:font color="darkblue">foreach</html:font></html:b>(p;; <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">person</html:font></html:b>)&#xD;
  {&#xD;
    <html:b><html:font color="darkgreen">array </html:font></html:b><html:b><html:font color="darkbrown">row</html:font></html:b> = ({});&#xD;
    <html:b><html:font color="darkblue">foreach</html:font></html:b>(fields;; <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">f</html:font></html:b>)&#xD;
    {&#xD;
       <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">fv</html:font></html:b> = person-&gt;valueForKey_(f);&#xD;
       <html:b><html:font color="darkblue">if</html:font></html:b>(<html:b><html:font color="darkgreen">object</html:font></html:b><html:b><html:font color="darkbrown">_program</html:font></html:b>(fv) == Cocoa.ABMultiValue)&#xD;
         row += ({(<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)fv-&gt;valueAtIndex_(0) });&#xD;
       <html:b><html:font color="darkblue">else</html:font></html:b> row += ({(<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)fv});&#xD;
    }&#xD;
    write((row*<html:i><html:font color="darkred">","</html:font></html:i>) + <html:i><html:font color="darkred">"&amp;#110;"</html:font></html:i>);&#xD;
  }&#xD;
}&#xD;
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
The next example demonstrates the use of the Pike framework in Objective-C code. This example code will start up an embedded Pike interpreter and evaluate some simple code. Note that the The new Pike framework can be generated by a <html:i class="ital">make framework</html:i> performed in the build directory of a recent Pike 7.7.<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
<html:font color="brown">#import &lt;PikeInterpreter/OCPikeInterpreter.h&gt;&#xD;
</html:font><html:font color="brown">#import &lt;Foundation/NSString.h&gt;&#xD;
</html:font>&#xD;
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>()&#xD;
{&#xD;
  id i;&#xD;
  struct svalue * sv;<html:p class="paragraph"/>
  <html:font color="red">// required for console mode objective c applications&#xD;
</html:font>  NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];<html:p class="paragraph"/>
  <html:font color="red">// these 3 lines set up and start the interpreter.&#xD;
</html:font>  i = [OCPikeInterpreter sharedInterpreter];<html:p class="paragraph"/>
  <html:font color="red">// we can optionally specify an alternate master, or use the one bundled in the framework.&#xD;
</html:font>  [i setMaster: @<html:i><html:font color="darkred">"/usr/local/pike/7.7.30/lib/master.pike"</html:font></html:i>];&#xD;
  [i startInterpreter];<html:p class="paragraph"/>
  <html:font color="red">// ok, now that we have things set up, let's use it.&#xD;
</html:font>  <html:font color="red">// first, an example of calling pike c level apis directly.  &#xD;
</html:font>  f_version(0);&#xD;
  printf(<html:i><html:font color="darkred">"%s&amp;#110;"</html:font></html:i>, Pike_sp[-1].u.string-&gt;str);&#xD;
  pop_stack();<html:p class="paragraph"/>
  <html:font color="red">// next, we'll demonstrate one of the convenience functions available&#xD;
</html:font>  sv = [i evalString: @<html:i><html:font color="darkred">"1+2"</html:font></html:i>];&#xD;
  printf(<html:i><html:font color="darkred">"type: %d, value: %d&amp;#110;"</html:font></html:i>, sv-&gt;type, sv-&gt;u.integer);&#xD;
  free_svalue(sv);<html:p class="paragraph"/>
  <html:font color="red">// finally, we clean up.&#xD;
</html:font>  [i stopInterpreter];&#xD;
  [innerPool release];&#xD;
  <html:b><html:font color="darkblue">return</html:font></html:b> 0;&#xD;
}<html:p class="paragraph"/>
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
And last, but not least, is a sample of using Public.ObjectiveC with Interface Builder to produce a native Cocoa application. This is basically a Pike port of the Currency Converter application used as a tutorial by Apple. You can follow along at the <html:a href="Apple Developer" class="wiki_link_external">http://developer.apple.com</html:a> website.<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
<html:b><html:font color="darkblue">import</html:font></html:b> Public.ObjectiveC;<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">NSApp</html:font></html:b>;<html:p class="paragraph"/>
<html:b><html:font color="darkblue">class</html:font></html:b> ConverterController&#xD;
{&#xD;
  <html:b><html:font color="darkblue">inherit</html:font></html:b> Cocoa.NSObject;<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">exchangeRate</html:font></html:b>;&#xD;
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">dollarsToConvert</html:font></html:b>;&#xD;
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">convertedAmount</html:font></html:b>;<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">void </html:font></html:b><html:b><html:font color="darkbrown">convert_</html:font></html:b>(<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">action</html:font></html:b>)&#xD;
  {&#xD;
    <html:b><html:font color="darkgreen">float </html:font></html:b><html:b><html:font color="darkbrown">x</html:font></html:b>;&#xD;
    x = exchangeRate-&gt;floatValue() * dollarsToConvert-&gt;floatValue();&#xD;
    convertedAmount-&gt;setFloatValue_(x);&#xD;
  }&#xD;
}<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>(<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">argc</html:font></html:b>, <html:b><html:font color="darkgreen">array </html:font></html:b><html:b><html:font color="darkbrown">argv</html:font></html:b>)&#xD;
{          &#xD;
   NSApp = Cocoa.NSApplication.sharedApplication();&#xD;
   <html:b><html:font color="darkblue">return</html:font></html:b> AppKit()-&gt;NSApplicationMain(argc, argv);&#xD;
}&#xD;
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
This module is alpha quality code. It may crash your Pike, though it does work pretty well with threads, both Pike and NSThreads. You can also use it to build real Cocoa applications using Pike. Currently, you have to set up the application bundle yourself, but that's a relatively easy thing to do.<html:p class="paragraph"/>
<html:b class="bold">The TODO List</html:b>&#xD;
<html:ul class="minus">
<html:li>KVO and Bindings support</html:li>
<html:li>bundle support for writing PrefPanes and such <html:i class="ital">(in progress)</html:i></html:li>
<html:li>support for in-out parameters and variants <html:i class="ital">(in-out pointer handling in progress)</html:i></html:li>
<html:li>get DO working properly with proxied classes.</html:li>
<html:li>support for c-structs and c-arrays as arguments and return values <html:i class="ital">(in progress)</html:i></html:li>
<html:li>investigate feasibility of supporting <html:a href="GNUStep" class="wiki_link_external">http://www.gnustep.org</html:a> or <html:a href="The Cocotron" class="wiki_link_external">http://www.cocotron.org</html:a>.</html:li>
<html:li>variable overloading for accessing Cocoa variables from Pike using `-&gt;symbol() and friends. <html:i class="ital">(in progress)</html:i></html:li>
<html:li>ability to refine methods for classes in an easily extended way <html:i class="ital">(complete, see mixins/ for examples.)</html:i></html:li>
<html:li>Backend running while in NSApplicationMain() <html:i class="ital">(complete)</html:i></html:li>
<html:li>automated application bundling <html:i class="ital">(in progress, using Pike.framework in 7.7)</html:i></html:li>
</html:ul>If you're a Cocoa developer and would like to help, please get in touch!</html:div></atom:subtitle>
</atom:feed>
